////////////////////////////////////////////////////////////////////////////////
/// tototoy Code
/// $Id: xml_parser.h 31 2009-09-30 10:05:21Z tonyjobmails $
/// $Date: 2009-09-30 10:05:21 +0000 (Wed, 30 Sep 2009) $
/// $Author: tonyjobmails $
/// $Revision: 31 $
/// E-mail: tonyjobmails@gmail.com
/// filename: xml_parser.h
/// function: xml解析类的定义 
////////////////////////////////////////////////////////////////////////////////

#ifndef _XML_PARSER
#define _XML_PARSER

#include <time.h>
#include <string>
#include "base.h"
#include "TinyXml/tinyxml.h"

using namespace std;
using namespace base_type;

typedef TiXmlDocument tiny_xml_doc;
typedef TiXmlElement tiny_xml_elem;
typedef TiXmlAttribute tiny_xml_attr;

class xml_parser
{
	public:
		/// 构造函数
		xml_parser();
		xml_parser(const string &file_name);
		xml_parser(const char* file_name);

		/// 析构函数
		virtual ~xml_parser();
		
		/// 初始化将要解析文件
		bool init_file(const string &file_name);
		bool init_file(const char* file_name);
		
		/// 得到根结点为root_name的元素，root_name为空则找到第一个根结点元素
		const tiny_xml_elem* get_root_node(const char *root_name = 0);
		/// 得到下一个结点为next_name的元素，next_name为空则找到下一个结点的元素
		const tiny_xml_elem* get_next_node(const tiny_xml_elem *p_node, const char *next_name = 0);
		/// 得到子结点为child_name的元素，child_name为空则找到第一个结点的元素
		const tiny_xml_elem* get_child_node(const tiny_xml_elem *p_node, const char *child_name = 0);
		/// 得到结点为attribute_name的属性，attribute_name为空则找到第一个属性的值
		const tiny_xml_attr* get_node_attribute(const tiny_xml_elem *p_node, const char *attribute_name = 0);
		/// 得到结点的内容
		const char* get_node_text(const tiny_xml_elem *p_node);
		
		////////////////////////////////////////////////////////////
		/// 得到结点的属性，转化为相应的类型
		/// 转化为数字
		bool get_node_attribute_num(const tiny_xml_elem *p_node, void* value,
								const unsigned int _size, const char *attribute_name = 0);
		/// 转化为字符串
		bool get_node_attribute_string(const tiny_xml_elem *p_node, void* value, 
								const unsigned int _size, const char *attribute_name = 0);
		/// 转化为时间
		bool get_node_attribute_time(const tiny_xml_elem *p_node, time_t &value, 
								const char *attribute_name = 0);
		/// 得到结点的属性，转化为相应的类型结束
		////////////////////////////////////////////////////////////
		
	private:
		/// xml文档
		tiny_xml_doc xml_config_file;
};

#endif
